/**
 *  中间件公共目录 
 */
const bodyParser = require('koa-bodyparser') // 接受post请求参数需要使用
const nunjucks = require('koa-nunjucks-2') // 模版引擎
const ip = require('ip')
const path = require('path')
const staticFiles = require('koa-static') // 指定静态资源目录
const miSend = require('./mi-send')
// 引入日志中间件
const miLog = require('./mi-log')
// 引入请求错误中间件
const miHttpError = require('./mi-http-error')

module.exports = (app) => {
  // 应用请求错误中间件
  app.use(miHttpError({
    errorPageFolder: path.resolve(__dirname, '../errorPage')
  }))
  // 将配置中间件的参数在注册中间件时作为参数传入
  app.use(miLog({
    env: app.env,  // koa 提供的环境变量
    projectName: 'koa2-tutorial',
    appLogLevel: 'debug',
    dir: 'logs',
    serverIp: ip.address()
  }))
  // 指定public目录为静态资源目录，用来存放js css images 等
  app.use(staticFiles(path.resolve(__dirname, '../public')))
  // 设置模版引擎
  app.use(nunjucks({
    ext: 'html',
    path: path.join(__dirname, '../views'),// 指定视图目录
    nunjucksConfig: {
      trimBlocks: true // 开启转义 防Xss
    }
  }))
  app.use(bodyParser())
  app.use(miSend())

  // 增加错误的监听处理
  app.on("error", (err, ctx) => {
    if (ctx && !ctx.headerSent && ctx.status < 500) {
      ctx.status = 500
    }
    if (ctx && ctx.log && ctx.log.error) {
      if (!ctx.state.logged) {
        ctx.log.error(err.stack)
      }
    }
  })
}